#include<iostream>
#include<unistd.h>
#include<signal.h>

using namespace std;

void PrintPending(sigset_t &pending)
{
    for(int signo=31;signo>=1;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
    }
    cout<<endl;
}

void handler(int signo)
{
    cout<<"catch a signo"<<signo<<endl;
}

int main()
{
    // 4. 我可以将所有的信号都进行屏蔽，信号不就不会被处理了吗？ 肯定的！9
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    for (int i = 1; i <= 31; i++)
    {
        sigaddset(&bset, i); // 屏蔽了所有信号吗？？？
    }
    sigprocmask(SIG_SETMASK, &bset, &oset);

    sigset_t pending;
    while (true)
    {
        // 2.1 获取
        int n = sigpending(&pending);
        if (n < 0)
            continue;
        // 2.2 打印
        PrintPending(pending);
        sleep(1);
    }
    return 0;
}

#if 0
int main()
{
    //0.对2号信号进行自定义的捕捉
    signal(2,handler);

    //1、先对2号信号进行屏蔽
    sigset_t bset,oset;//在栈上开辟的空间,用户栈上的，属于用户区
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset,2);//没有设置进入到我的进程task_struct

    //1.2调用系统调用，将数据设置进内核
    sigprocmask(SIG_SETMASK,&bset,&oset);//成功屏蔽了2号信号

    //2、重复打印当前进程的pending 00000000000000
    sigset_t pending;
    int cnt=0;
    while(true)
    {
        //2.1获取
        int n=sigpending(&pending);
        if(n<0)continue;
        //2.2打印
        PrintPending(pending);

        sleep(1);
        cnt++;
        //2.3解除阻塞
        if(cnt==20)
        {
            cout<<"unblock 2 signo"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);//成功屏蔽了2号信号
        }
    }   

    //3.发送2号信号 000000000000000010

    //4.如果将所有的信号屏蔽，信号就不会被处理了吗？
    //所以一些信号不能被捕捉
    return 0;
}
#endif 